
1. Scan design. Collect information
    - Check for unsupported constructs. Throw errors as appropriate
        - Uniform regwidth, accesswidth, etc.

    - Collect reset signals
        cpuif_reset, field_reset
        explicitly assigned to field->resetsignal

    - Collect any other misc user signals that are referenced in the design

    - Top-level interrupts
        Collect X & Y:
            X = set of all registers that have an interrupt field
            Y = set of all interrupt registers that are referenced by a field
        Top level interrupt registers are the set in X, but not in Y
        (and probably other caveats. See notes)

2. Create intermediate template objects

3. Render top-level IO struct package (if applicable)

4. Render top-level module template
